/**
 * Sac.java - Sac (ou pioche) de jetons du jeu
 * 
 * @author BOURGE Denis && BEGORRE Alexandre
 * @version 1.0
 */

package elements.jetons;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import elements.dictionnaire.Dictionnaire;

public class Sac {

	private Dictionnaire		dico;
	private ArrayList<Jeton>	listeJetons;

	/**
	 * Constructeur du sac
	 * 
	 * @param pathToDico
	 *            Chemin vers le dictionnaire
	 * @throws IOException
	 *             Exception d'I/O
	 */
	public Sac(String pathToDico) throws IOException {

		dico = new Dictionnaire();
		dico.chargerDictionnaire(pathToDico);
		dico.creerMapFrequences();
		dico.genererJetons();

		listeJetons = new ArrayList<Jeton>();

		creerListe(dico);
	}

	/**
	 * Crée la liste des jetons (est utilisée en interne)
	 * 
	 * @param dico
	 *            Dictionnaire
	 */
	private void creerListe(Dictionnaire dico) {

		Iterator<Entry<Character, Integer>> i = dico.getValeurJetons().entrySet().iterator();
		while (i.hasNext()) {
			Map.Entry<Character, Integer> pairs = i.next();

			for (int j = 0; j < dico.getNombreJetons().get(pairs.getKey()); j++)
				listeJetons.add(new Jeton(pairs.getKey(), pairs.getValue()));
		}
	}

	/**
	 * Affiche la liste des jetons dans la console
	 */
	public void afficherListe() {

		for (int i = 0; i < listeJetons.size(); i++)
			System.out.println(listeJetons.get(i));
	}

	/**
	 * Retourne un jeton aléatoirement dans le sac et l'enlève de celui-ci
	 * 
	 * @return Le jeton aléatoire (ou null si le sac est vide)
	 */
	public Jeton jetonAleatoire() {

		if (listeJetons.size() != 0) {
			// Example assumes these variables have been initialized
			// above, e.g. as method parameters, fields, or otherwise
			// such as: rand = new Random();
			Random rand = new Random();

			// nextInt is normally exclusive of the top value,
			// so add 1 to make it inclusive
			int randomNum = rand.nextInt(listeJetons.size());

			Jeton j = listeJetons.get(randomNum);
			listeJetons.remove(randomNum);

			return j;
		} else
			return null;
	}

	/**
	 * Ajoute un jeton
	 * 
	 * @param j
	 *            Jeton à ajouter
	 */
	public void ajouterJeton(Jeton j) {

		listeJetons.add(j);
	}

	/**
	 * Retourne le dictionnaire du sac
	 * 
	 * @return Le dictionnaire du sac
	 */
	public Dictionnaire prendreDico() {

		return dico;
	}

	/**
	 * Fonction principale (de test)
	 * 
	 * @param args
	 *            Arguments en ligne de commande
	 */
	public static void main(String[] args) {

		try {
			Sac sac = new Sac("data/dicos/dico_francais.txt");
			sac.afficherListe();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
